home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Effects / EffectMgr.C < prev    next >
C/C++ Source or Header  |  2005-03-14  |  7KB  |  292 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   EffectMgr.C - Effect manager, an interface betwen the program and effects
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include "EffectMgr.h"
  26.  
  27. EffectMgr::EffectMgr(int insertion_,pthread_mutex_t *mutex_){
  28.     setpresettype("Peffect");
  29.     efx=NULL;
  30.     nefx=0;
  31.     insertion=insertion_;
  32.     mutex=mutex_;
  33.     efxoutl=new REALTYPE[SOUND_BUFFER_SIZE];
  34.     efxoutr=new REALTYPE[SOUND_BUFFER_SIZE];;
  35.     for (int i=0;i<SOUND_BUFFER_SIZE;i++){
  36.     efxoutl[i]=0.0;
  37.     efxoutr[i]=0.0;
  38.     };
  39.     filterpars=NULL;
  40.     dryonly=false;
  41.     defaults();
  42. };
  43.  
  44.  
  45. EffectMgr::~EffectMgr(){
  46.     if (efx!=NULL) delete (efx);
  47.     delete (efxoutl);
  48.     delete (efxoutr);
  49. };
  50.  
  51. void EffectMgr::defaults(){
  52.     changeeffect(0);
  53.     setdryonly(false);
  54. };
  55.  
  56. /*
  57.  * Change the effect
  58.  */
  59. void EffectMgr::changeeffect(int nefx_){
  60.     cleanup();
  61.     if (nefx==nefx_) return;
  62.     nefx=nefx_;
  63.     for (int i=0;i<SOUND_BUFFER_SIZE;i++){
  64.     efxoutl[i]=0.0;
  65.     efxoutr[i]=0.0;
  66.     };
  67.  
  68.     if (efx!=NULL) delete (efx);
  69.     switch (nefx){
  70.     case 1:efx=new Reverb(insertion,efxoutl,efxoutr);break;
  71.     case 2:efx=new Echo(insertion,efxoutl,efxoutr);break;
  72.     case 3:efx=new Chorus(insertion,efxoutl,efxoutr);break;
  73.     case 4:efx=new Phaser(insertion,efxoutl,efxoutr);break;
  74.     case 5:efx=new Alienwah(insertion,efxoutl,efxoutr);break;
  75.     case 6:efx=new Distorsion(insertion,efxoutl,efxoutr);break;
  76.     case 7:efx=new EQ(insertion,efxoutl,efxoutr);break;
  77.     case 8:efx=new DynamicFilter(insertion,efxoutl,efxoutr);break;
  78.     //put more effect here
  79.     default:efx=NULL;break;//no effect (thru)
  80.     };
  81.     
  82.     if (efx!=NULL) filterpars=efx->filterpars;
  83. };
  84.  
  85. /*
  86.  * Obtain the effect number
  87.  */
  88. int EffectMgr::geteffect(){
  89.     return (nefx);
  90. };
  91.  
  92. /*
  93.  * Cleanup the current effect
  94.  */
  95. void EffectMgr::cleanup(){
  96.     if (efx!=NULL) efx->cleanup();
  97. };
  98.  
  99.  
  100. /*
  101.  * Get the preset of the current effect
  102.  */
  103.  
  104. unsigned char EffectMgr::getpreset(){
  105.     if (efx!=NULL) return(efx->Ppreset);
  106.     else return(0);
  107. };
  108.  
  109. /*
  110.  * Change the preset of the current effect
  111.  */
  112. void EffectMgr::changepreset_nolock(unsigned char npreset){
  113.     if (efx!=NULL) efx->setpreset(npreset);
  114. };
  115.  
  116. /*
  117.  * Change the preset of the current effect(with thread locking)
  118.  */
  119. void EffectMgr::changepreset(unsigned char npreset){
  120.     pthread_mutex_lock(mutex);
  121.     changepreset_nolock(npreset);
  122.     pthread_mutex_unlock(mutex);
  123. };
  124.  
  125.  
  126. /*
  127.  * Change a parameter of the current effect 
  128.  */
  129. void EffectMgr::seteffectpar_nolock(int npar,unsigned char value){
  130.     if (efx==NULL) return;
  131.     efx->changepar(npar,value);
  132. };
  133.  
  134. /*
  135.  * Change a parameter of the current effect (with thread locking)
  136.  */
  137. void EffectMgr::seteffectpar(int npar,unsigned char value){
  138.     pthread_mutex_lock(mutex);
  139.     seteffectpar_nolock(npar,value);
  140.     pthread_mutex_unlock(mutex);
  141. };
  142.  
  143. /*
  144.  * Get a parameter of the current effect
  145.  */
  146. unsigned char EffectMgr::geteffectpar(int npar){
  147.     if (efx==NULL) return(0);
  148.     return(efx->getpar(npar));
  149. };
  150.  
  151.  
  152. /*
  153.  * Apply the effect
  154.  */
  155. void EffectMgr::out(REALTYPE *smpsl,REALTYPE *smpsr){
  156.     int i;
  157.     if (efx==NULL){
  158.     if (insertion==0) 
  159.         for (i=0;i<SOUND_BUFFER_SIZE;i++){
  160.          smpsl[i]=0.0;smpsr[i]=0.0;
  161.          efxoutl[i]=0.0;efxoutr[i]=0.0;
  162.         };
  163.     return;
  164.     };
  165.     for (i=0;i<SOUND_BUFFER_SIZE;i++){
  166.     smpsl[i]+=denormalkillbuf[i];
  167.     smpsr[i]+=denormalkillbuf[i];
  168.     efxoutl[i]=0.0;
  169.     efxoutr[i]=0.0;
  170.     };
  171.     efx->out(smpsl,smpsr);
  172.     
  173.     REALTYPE volume=efx->volume;
  174.     
  175.     if (nefx==7){//this is need only for the EQ effect
  176.     for (i=0;i<SOUND_BUFFER_SIZE;i++){
  177.         smpsl[i]=efxoutl[i];
  178.         smpsr[i]=efxoutr[i];
  179.     };
  180.     return;
  181.     };
  182.     
  183.     //Insertion effect
  184.     if (insertion!=0) {
  185.         REALTYPE v1,v2;
  186.     if (volume<0.5) {
  187.         v1=1.0;
  188.         v2=volume*2.0;
  189.     } else {
  190.         v1=(1.0-volume)*2.0;
  191.         v2=1.0;
  192.         };
  193.     if ((nefx==1)||(nefx==2)) v2*=v2;//for Reverb and Echo, the wet function is not liniar
  194.     
  195.     if (dryonly){//this is used for instrument effect only
  196.             for (i=0;i<SOUND_BUFFER_SIZE;i++){
  197.         smpsl[i]*=v1;
  198.         smpsr[i]*=v1;
  199.         efxoutl[i]*=v2;
  200.         efxoutr[i]*=v2;
  201.         };
  202.     }else{//normal instrument/insertion effect 
  203.             for (i=0;i<SOUND_BUFFER_SIZE;i++){
  204.         smpsl[i]=smpsl[i]*v1+efxoutl[i]*v2;
  205.         smpsr[i]=smpsr[i]*v1+efxoutr[i]*v2;
  206.         };
  207.     };
  208.     } else {//System effect
  209.     for (i=0;i<SOUND_BUFFER_SIZE;i++){
  210.         efxoutl[i]*=2.0*volume;
  211.         efxoutr[i]*=2.0*volume;
  212.         smpsl[i]=efxoutl[i];
  213.         smpsr[i]=efxoutr[i];
  214.     };
  215.     };
  216.     
  217. };
  218.  
  219. /*
  220.  * Get the effect volume for the system effect
  221.  */
  222. REALTYPE EffectMgr::sysefxgetvolume(){
  223.     if (efx==NULL) return (1.0);
  224.     else return(efx->outvolume);    
  225. };
  226.  
  227.  
  228. /*
  229.  * Get the EQ response
  230.  */
  231. REALTYPE EffectMgr::getEQfreqresponse(REALTYPE freq){
  232.     if (nefx==7) return(efx->getfreqresponse(freq));
  233.     else return(0.0);
  234. };
  235.  
  236.  
  237. void EffectMgr::setdryonly(bool value){
  238.     dryonly=value;
  239. };
  240.  
  241. void EffectMgr::add2XML(XMLwrapper *xml){
  242.     xml->addpar("type",geteffect());
  243.  
  244.     if ((efx==NULL)||(geteffect()==0)) return;
  245.     xml->addpar("preset",efx->Ppreset);
  246.  
  247.     xml->beginbranch("EFFECT_PARAMETERS");
  248.     for (int n=0;n<128;n++){
  249.         int par=geteffectpar(n);
  250.         if (par==0) continue;
  251.         xml->beginbranch("par_no",n);
  252.         xml->addpar("par",par);
  253.         xml->endbranch();
  254.     };
  255.     if (filterpars!=NULL){
  256.         xml->beginbranch("FILTER");
  257.         filterpars->add2XML(xml);
  258.         xml->endbranch();
  259.     };
  260.     xml->endbranch();
  261. };
  262.  
  263. void EffectMgr::getfromXML(XMLwrapper *xml){
  264.     changeeffect(xml->getpar127("type",geteffect()));
  265.  
  266.     if ((efx==NULL)||(geteffect()==0)) return;
  267.     
  268.     efx->Ppreset=xml->getpar127("preset",efx->Ppreset);
  269.  
  270.     if (xml->enterbranch("EFFECT_PARAMETERS")){
  271.     for (int n=0;n<128;n++){
  272.         seteffectpar_nolock(n,0);//erase effect parameter
  273.         if (xml->enterbranch("par_no",n)==0) continue;
  274.  
  275.         int par=geteffectpar(n);
  276.         seteffectpar_nolock(n,xml->getpar127("par",par));
  277.         xml->exitbranch();
  278.     };
  279.     if (filterpars!=NULL){
  280.         if (xml->enterbranch("FILTER")){
  281.         filterpars->getfromXML(xml);
  282.         xml->exitbranch();
  283.         };
  284.     };
  285.     xml->exitbranch();
  286.     };
  287.     cleanup();
  288. };
  289.  
  290.  
  291.  
  292.